Overview
Léigh Dom — Irish for "read to me", a sibling of abair ("say") and fotheidil ("subtitle") — turns a document into narrated Irish audio. Upload a PDF, EPUB, DOCX, ODT, RTF, HTML, Markdown or plain-text file, pick a voice, and get back a stitched WAV, the extracted text, timed subtitles, and optionally an MP4 of the reading page with the spoken sentence lit up.
What it does
- Reads eight formats, each with its own extractor. The text is normalised before it is spoken, and is downloadable in its own right.
- Survives restarts mid-document. Every chunk is written to disk as it arrives, so a seven-hour job resumes rather than starting again.
- Streams progress live over Server-Sent Events, so a long job shows real movement instead of a spinner.
- Lets the transcript be edited before or after synthesis. Unchanged paragraphs keep their existing audio; only what was actually edited is re-synthesised.
- Exports four ways — WAV, text, subtitles (SRT or VTT), and video.
Voices
Seven Piper voices, a static list in lib/voices.ts mirrored from abair_website/data/synthesis.ts. The HTS voices are deliberately not carried over, and the catalogue is not fetched at run time — a voice added, removed or renamed on the ABAIR website has to be mirrored there or it will not appear.
| Voice | Dialect | Voice code |
|---|---|---|
| Sibéal | Connemara | ga_CO_snc_piper |
| Áine | Ulster | ga_UL_anb_piper |
| Dónall | Ulster | ga_UL_doc_piper |
| Colm | Munster | ga_MU_cmg_piper |
| Neasa | Munster | ga_MU_nnc_piper |
| Danny | Munster (heritage) | ga_MU_dms_piper |
| Fianait | Munster — An Rinn | ga_MU_ar_fnm_piper |
Each has a ~4-second preview in public/voice-previews/, all speaking the same phrase so they can be compared. A missing one falls back to live synthesis, so it costs latency rather than breaking the picker.
Access
Sign-in is delegated to ABAIR Auth over the redirect flow, the same one Fotheidil uses — Léigh Dom owns no login form and stores no passwords. It has no roles: it reads nothing from auth_user_roles (unlike the CUL staff portal, see Authorization & Permissions), so any signed-in ABAIR account may use it.
| Surface | Signed out |
|---|---|
/, /terms, /privacy | Public |
/library, /library/[id] | Rendered, with a sign-in prompt and no data |
/api/jobs* | 401 {"error":"unauthorized"} — JSON, not an HTML login page, because the callers are fetch |
/api/voices, /api/voice-previews/*, /api/capabilities, /api/health | Public — the landing page's voice sampler needs them |
Ownership is enforced per query rather than per route, and somebody else's document id returns 404, not 403, so the id is never confirmed to exist.
Limits
| Limit | Value | Set by |
|---|---|---|
| Upload size | 25 MiB | MAX_DOC_BYTES |
| Normalised text | 300,000 characters (≈7 h of audio) | MAX_TEXT_CHARS |
| Concurrent upstream TTS requests | 1, process-wide | TTS_GLOBAL_CONCURRENCY |
| Documents being extracted and chunked at once | 2 across all users, no per-user limit | RUNNER_PREPARE_SLOTS |
| Documents synthesising at once | 2 across all users, 1 per user | RUNNER_JOB_SLOTS |
| Video renders at once | 1, niced to 15 | RENDER_JOB_SLOTS, RENDER_NICE |
| Retention | 30 days, then rows and artefacts are deleted | RETENTION_DAYS |
The concurrency of 1 is deliberate: the synthesis backend renders serially, and on the same input 8 of 8 chunks succeeded one at a time against 1 of 8 at concurrency 2. Raising it makes throughput worse. Retention is a disk budget rather than a policy — see Deployment.
What it is not
- Not a document reader. It produces files; in-browser playback is for checking the result.
- Not a speech engine. Every second of audio comes from
synthesis.abair.ie— there is no local model and no fallback voice. - Not shared. No sharing, no team library, no public links.
- Not durable storage. Documents are swept after 30 days and the volume is not backed up.
Useful Links
| Description | Link |
|---|---|
| Production | https://leighdom.abair.ie |
| GitHub repository | https://github.com/phonlab-tcd/leigh-dom |
| Speech backend | https://synthesis.abair.ie |
| Sign-in | https://auth.abair.ie |
| Health probe | https://leighdom.abair.ie/api/health |
Where to go next
| If you're… | Start here |
|---|---|
| Working on the pipeline or the job runner | Architecture |
| Wondering why a document is stuck | Architecture → failure modes |
| Shipping a change | Deployment |
| Deploying it somewhere new | Deployment → adding it to a fresh estate |
Last updated 2026-09-16